package com.yty.demo._4_oop.design_patterns.singleton;

/**
 * @author: yangtaoyao
 * @time: 2020/1/8 11:34
 * @description: 单例设计模式
 */
/**
 * 饿汉式
 */
public class Singleton {
    private static Singleton instance=new Singleton();

    private Singleton(){
    }

    public static Singleton getInstance(){
        return instance;
    }
}

/**
 * 懒汉式
 * 实例延迟加载
 */
class Singleton2{
    private static Singleton2 instance=null;

    private Singleton2(){
    }

    public static Singleton2 getInstance(){
        if(instance==null){
            instance=new Singleton2();
        }
        return instance;
    }
}

/**
 * 双重加锁机制
 */
class Singleton3{
    private static volatile Singleton3 instance=null;

    private Singleton3(){
    }

    public static Singleton3 getInstance(){
        if(instance==null){
            synchronized (Singleton3.class){
                if(instance==null) {
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }
}

/**
 *静态内部类
 */
class Singleton4 {
    private static class SingletonHoler {
        /**
         * 静态初始化器，由JVM来保证线程安全
         */
        private static Singleton4 instance = new Singleton4();
    }

    private Singleton4() {
    }

    public static Singleton4 getInstance() {
        return SingletonHoler.instance;
    }
}

/*
破坏单例模式的三种方式
反射
序列化
克隆

解决方案如下：

1、防止反射

   定义一个全局变量，当第二次创建的时候抛出异常

2、防止克隆破坏

      重写clone(),直接返回单例对象

3、防止序列化破坏

   添加readResolve(),返回Object对象

* */

class Test{
    public static void main(String[] args) {

    }
}
